package com.swak.vertx;

import com.swak.vertx.transport.VertxProxy;
import com.swak.vertx.transport.codec.Msg;

import io.vertx.core.AsyncResult;
import io.vertx.core.Handler;
import io.vertx.core.Vertx;
import io.vertx.core.eventbus.Message;
import io.vertx.core.impl.ContextInternal;
import io.vertx.core.impl.VertxThread;
import io.vertx.core.impl.VertxUtils;

/**
 * Vertx 全局相关服务
 * 
 * @author DELL
 */
public class Vertxs {
	private static Vertxs ME = null;
	private final VertxProxy proxy;

	public Vertxs(VertxProxy proxy) {
		this.proxy = proxy;
		ME = this;
	}

	/**
	 * 发送消息
	 *
	 * @param address 地址
	 * @param request 请求
	 * @param timeout 超时时间
	 */
	public static void sentMessage(String address, Msg request, int timeout) {
		Vertxs.ME.proxy.sentMessage(address, request, timeout);
	}

	/**
	 * 发送消息
	 *
	 * @param address      地址
	 * @param request      请求
	 * @param timeout      发送的超时时间
	 * @param replyHandler 回调
	 */
	public static void sentMessage(String address, Msg request, int timeout,
			Handler<AsyncResult<Message<Msg>>> replyHandler) {
		Vertxs.ME.proxy.sentMessage(address, request, timeout, replyHandler);
	}

	/**
	 * Vertx 对象
	 * 
	 * @return
	 */
	public static Vertx vertx() {
		return Vertxs.ME.proxy.me();
	}

	/**
	 * 当前运行的上下文
	 * 
	 * @return
	 */
	public static ContextInternal context() {
		return ContextInternal.current();
	}

	/**
	 * 当前运行的上下文 -- 不需要返回默认
	 * 
	 * @return
	 */
	public static ContextInternal noDefcontext() {
		return VertxUtils.noDefcontext();
	}

	/**
	 * 是否在EventLoop线程运行
	 * 
	 * @return
	 */
	public static boolean isOnEventLoopThread() {
		Thread t = Thread.currentThread();
		return t instanceof VertxThread && !((VertxThread) t).isWorker();
	}
}